package it.orma.iridehr.repository;

import it.orma.iridehr.entities.*;

import java.math.BigInteger;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
public class CandidatoRepository{

	static Logger log = LogManager.getLogger(CandidatoRepository.class);

	@PersistenceContext
	private EntityManager entityManager;

	public void salvaDatiGenerali(DatiGenerali datiGenerali){
		log.info(ToStringBuilder.reflectionToString(datiGenerali));
		datiGenerali.getSchedaCandidato().setDataModifica(new Date());
		entityManager.merge(datiGenerali);
		entityManager.flush();
		entityManager.detach(datiGenerali);
	}
	
	public void salvaLinkAlfresco(CVCandidato doc){
		entityManager.persist(doc);
		entityManager.flush();
		entityManager.detach(doc);
	}
	
	@Transactional
	public void salvaLinkAlfrescoNoTx(CVCandidato doc) {
		entityManager.persist(doc);
		entityManager.flush();
		entityManager.detach(doc);		
	}
	
	public BigInteger checkDocExists( Long idCandidato, String title) {
		String nativeSql = "select count(a.*) from cv_candidato as a where a.id_candidato = ?  and a.titolo = ? ";	
		Query query = entityManager.createNativeQuery(nativeSql);
		query.setParameter(1, idCandidato);
		query.setParameter(2, title);		
		
		BigInteger result = (BigInteger) query.getSingleResult();
		
	    entityManager.detach(result);
		
		return result;
		
	}
	
	public Boolean salvaLinkAlfrescoIfNotExists(CVCandidato doc){
		if(checkDocExists(doc.getIdCandidato(),doc.getTitolo()).intValue()==0){
			salvaLinkAlfresco(doc);
			return true;
		}
		return false;
		
	}

	public void salvaTitoloDiStudio(TitoloDiStudio titoloDiStudio) {
		if (titoloDiStudio.getIdTitoloDiStudio()==null){
			entityManager.persist(titoloDiStudio);
		} else {
			entityManager.merge(titoloDiStudio);
		}
		entityManager.flush();
		entityManager.detach(titoloDiStudio);

	}

	public void cancellaTitoloDiStudio(Long idTitoloDiStudio) {

		entityManager.remove(entityManager.find(TitoloDiStudio.class, idTitoloDiStudio));

	}

	public void salvaStudiCompiuti(StudiCompiuti studiCompiuti) {
		entityManager.merge(studiCompiuti);
		entityManager.flush();
		entityManager.detach(studiCompiuti);
	}

	public void salvaLingueConosciute(LingueConosciute lingueConosciute) {
		entityManager.merge(lingueConosciute);
		entityManager.flush();
		entityManager.detach(lingueConosciute);
	}

	public void salvaAltraLingua(AltraLingua altraLingua) {
		if (altraLingua.getIdAltraLingua()==null){
			altraLingua.setDataCreazione(new Date());
			entityManager.persist(altraLingua);
		} else {
			altraLingua.setDataModifica(new Date());
			entityManager.merge(altraLingua);
		}
		entityManager.flush();
		entityManager.detach(altraLingua);

	}

	public void cancellaAltraLingua(Long idAltraLingua) {
		AltraLingua a = entityManager.find(AltraLingua.class, idAltraLingua);
		entityManager.remove(a);


	}

	public void salvaConoscenzeInformatiche(ConoscenzeInformatiche conoscenzeInformatiche) {
		entityManager.merge(conoscenzeInformatiche);
	}

	public void salvaAltraConoscenzaInformatica(AltraConoscenzaInformatica altraConoscenzaInformatica){
		if (altraConoscenzaInformatica.getIdAltraConoscenzaInformatica()==null){
			altraConoscenzaInformatica.setDataCreazione(new Date());
			entityManager.persist(altraConoscenzaInformatica);
		} else {
			altraConoscenzaInformatica.setDataModifica(new Date());
			entityManager.merge(altraConoscenzaInformatica);
		}
		entityManager.flush();
		entityManager.detach(altraConoscenzaInformatica);
	}

	public void cancellaAltraConoscenzaInformatica(Long idConoscenzaInformatica){
		entityManager.remove(entityManager.find(AltraConoscenzaInformatica.class,idConoscenzaInformatica));
	}
	
	public void cancellaEsperienzaLavorativa(Long idEsperienzaLavorativa){
		entityManager.remove(entityManager.find(EsperienzaLavorativa.class,idEsperienzaLavorativa));
	}

	public void salvaEsperienzaLavorativa(EsperienzaLavorativa esperienzaLavorativa, SchedaCandidato schedaCandidato) {
		if (esperienzaLavorativa.getIdEsperienzaLavorativa()==null) {
			esperienzaLavorativa.setDataCreazione(new Date());
			esperienzaLavorativa.setSchedaCandidato(schedaCandidato);
			entityManager.persist(esperienzaLavorativa);
		} else {
			esperienzaLavorativa.setDataModifica(new Date());
			entityManager.merge(esperienzaLavorativa);
		}
		entityManager.flush();
		entityManager.detach(esperienzaLavorativa);
	}
	
	@Transactional
	public void salvaDomandeAttitudinali(List<Attitudine> attitudini) {
		 	Iterator<Attitudine> it = attitudini.iterator();
		 	while(it.hasNext()){
		 		Attitudine att = it.next();
		 		entityManager.merge(att);	
		 		entityManager.detach(att);
		 	}
		 	entityManager.flush();

	}
	
	
	public void creaDomandeAttitudinali(List<Attitudine> attitudini) {
		 	Iterator<Attitudine> it = attitudini.iterator();
		 	while(it.hasNext()){
		 		Attitudine att = it.next();
		 		entityManager.persist(att);
		 		entityManager.flush();
		 		entityManager.detach(att);
		 	}

	}
	
	public void salvaAltreInformazioni(AltreInformazioni info,SchedaCandidato schedaCandidato) {
		if (info.getIdAltraInformazione()==null) {
			info.setDataCreazione(new Date());
			info.setSchedaCandidato(schedaCandidato);
			entityManager.persist(info);
		} else {
			info.setDataModifica(new Date());
			entityManager.merge(info);
		}
		entityManager.flush();
		entityManager.detach(info);

	}

	public void creaNuovoCandidato(DatiGenerali datiGenerali,Users user) {
		datiGenerali.getSchedaCandidato().setConsensoTrattamento(0);
		entityManager.persist(datiGenerali.getSchedaCandidato());
		entityManager.persist(datiGenerali);
		user.setUserId(datiGenerali.getSchedaCandidato().getIdSchedaCandidato());	
		user.setDataCreazione(new Date());
		user.setEnabled(1);
		user.setUserName(datiGenerali.getMail1());
		UserRoles ur = new UserRoles();
		ur.setAuthority("ROLE_USER");
		ur.setUserId(user.getUserId());
		entityManager.persist(user);
		entityManager.persist(ur);		
		entityManager.flush();
		entityManager.detach(user);
		entityManager.detach(ur);
		entityManager.detach(datiGenerali);
		entityManager.detach(datiGenerali.getSchedaCandidato());
		
	}

	public void trattamentoAccettato(SchedaCandidato schedaCandidato) {
		entityManager.merge(schedaCandidato);
		entityManager.detach(schedaCandidato);
		entityManager.flush();
	}

	public String creaNuovaPassword() {
		
		String nativeSql = "SELECT SUBSTRING(MD5(RAND()) FROM 1 FOR 8) AS password";
		
		String password = (String) entityManager.createNativeQuery(nativeSql).getSingleResult();
		
		entityManager.detach(password);
		
		return password;
	}

	public void salvaNote(SchedaCandidato sc, NoteSelezionatore note) {
		if (note.getSchedaCandidato()==null) {
			note.setSchedaCandidato(sc);
			note.setDataCreazione(new Date());
			note.setDataCreazione(new Date());
			entityManager.persist(note);
		} else {
			note.setDataModifica(new Date());
			entityManager.merge(note);
		}
		entityManager.flush();
		entityManager.detach(note);
		
	}
	
}

